#pragma once 
#include <bits/stdc++.h>

/*****************************************************************************
 *! @brief 一个右值作为函数参数时，在函数内部再转发该参数的时候，其已经变成左值了.
 *!         我们需要一个函数按照参数原来的类型进行转发到另一个函数，这就是完美转发.
 *
 * 
 * 
 * 
 *  
 ****************************************************************************/

template<typename T>
void printValue(T& val) {
    std::cout << "lvalue" << std::endl;
}

template<typename T>
void printValue(T&& val) {
    std::cout << "rvalue" << std::endl;
}

template<typename T>
void forward(T&& val) {
    printValue(val);
    printValue(std::forward<T>(val));    // 完美转发
    printValue(std::move(val));          // 移动语义
}


int std_forward();